/**
 * Copyright (C) 2002-2015   The FreeCol Team
 * <p>
 * This file is part of FreeCol.
 * <p>
 * FreeCol is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 * <p>
 * FreeCol is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * <p>
 * You should have received a copy of the GNU General Public License
 * along with FreeCol.  If not, see <http://www.gnu.org/licenses/>.
 */

package net.sf.freecol.client.gui.menu;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import net.sf.freecol.client.FreeColClient;
import net.sf.freecol.client.gui.FreeColFrame;


/**
 * Test the menus.
 */
public class FreeColMenuTest implements ActionListener, ItemListener
{
    JTextArea output;
    JScrollPane scrollPane;
    final String newline = "\n";

    public JMenuBar createMenuBar( )
    {
        JMenuBar menuBar = null;

        FreeColClient client = new FreeColClient( null, null );
        client.startClient( null, null, true, true, null, null );

        //Create the menu bar.
        menuBar = new InGameMenuBar( client, null );
        client.updateActions( );
        ( ( FreeColMenuBar ) menuBar ).update( );

        return menuBar;
    }

    public Container createContentPane( )
    {
        //Create the content-pane-to-be.
        JPanel contentPane = new JPanel( new BorderLayout( ) );
        contentPane.setOpaque( true );

        //Create a scrolled text area.
        output = new JTextArea( 5, 30 );
        output.setEditable( false );
        scrollPane = new JScrollPane( output );

        //Add the text area to the content pane.
        contentPane.add( scrollPane, BorderLayout.CENTER );

        return contentPane;
    }

    @Override
    public void actionPerformed( ActionEvent ae )
    {
        JMenuItem source = ( JMenuItem ) ae.getSource( );
        String s = "Action event detected."
                + newline
                + "    Event source: " + source.getText( )
                + " (an instance of " + getClassName( source ) + ")";
        output.append( s + newline );
        output.setCaretPosition( output.getDocument( ).getLength( ) );
    }

    @Override
    public void itemStateChanged( ItemEvent e )
    {
        JMenuItem source = ( JMenuItem ) ( e.getSource( ) );
        String s = "Item event detected."
                + newline
                + "    Event source: " + source.getText( )
                + " (an instance of " + getClassName( source ) + ")"
                + newline
                + "    New state: "
                + ( ( e.getStateChange( ) == ItemEvent.SELECTED ) ?
                "selected" : "unselected" );
        output.append( s + newline );
        output.setCaretPosition( output.getDocument( ).getLength( ) );
    }

    // Returns just the class name -- no package info.
    protected String getClassName( Object o )
    {
        String classString = o.getClass( ).getName( );
        int dotIndex = classString.lastIndexOf( '.' );
        return classString.substring( dotIndex + 1 );
    }

    /** Returns an ImageIcon, or null if the path was invalid.
     *
     * @param path String
     * @return <code>ImageIcon</code>
     */
    protected static ImageIcon createImageIcon( String path )
    {
        java.net.URL imgURL = FreeColMenuTest.class.getResource( path );
        if ( imgURL != null )
        {
            return new ImageIcon( imgURL );
        }
        else
        {
            System.err.println( "Couldn't find file: " + path );
            return null;
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI( )
    {
        //Create and set up the window.
        //JFrame frame = new JFrame("MenuDemo");
        FreeColClient client = new FreeColClient( null, null );
        client.startClient( null, null, true, true, null, null );
        FreeColFrame frame = new FreeColFrame( client,
                                               GraphicsEnvironment.getLocalGraphicsEnvironment( ).getDefaultScreenDevice( ),
                                               null, null, true, null );
        frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );

        //Create and set up the content pane.
        FreeColMenuTest demo = new FreeColMenuTest( );
        frame.setJMenuBar( demo.createMenuBar( ) );
        frame.setContentPane( demo.createContentPane( ) );

        //Display the window.
        frame.setPreferredSize( new Dimension( 450, 260 ) );
        frame.setVisible( true );
    }

    public static void main( String[] args )
    {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater( ( ) ->
                                                { createAndShowGUI( ); } );
    }
}
